/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package kingdoms;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * @author fernando
 */
public class AtorJogador extends JPanel {

    private JButton botaoPegarCarta;
    private JLabel labelNomeJogador;
    private JLabel nomeJogador;
    private JLabel pontos;
    private JLabel labelPontos;
    private JPanel painelBaralho;
    private JPanel painelJogadorPontuacao;
    // End of variables declaration                   

    private Tabuleiro tabuleiro;

    //Atributos jogador
    private int id;
    private String nome;
    private Color cor;
    private int pontuacao;

    private List<Peca> pecas;
    private Peca pecaSelecionada;

    public AtorJogador(Tabuleiro tabuleiro, int id, String nome, Color cor) {
        this.tabuleiro = tabuleiro;
        this.id = id;
        this.nome = nome;
        this.cor = cor;

        this.setLayout(new BorderLayout());

        this.tabuleiro = tabuleiro;

        //
        this.nomeJogador = new JLabel(nome);

        this.pontos = new JLabel("0");

        //
        this.labelNomeJogador = new JLabel("Jogador: ");
        this.labelNomeJogador.setForeground(cor);

        this.labelPontos = new JLabel("Pontos: ");
        //
        criarPainelJogadorPontuacao();
        //

        this.add(painelJogadorPontuacao, BorderLayout.WEST);

        //
    }

    public void verificarDecks() {
        if (!tabuleiro.getPartida().isPartidaEmRede() || (tabuleiro.getPartida().isPartidaEmRede() && tabuleiro.getPartida().getJogador1().equals(this))) {
            this.botaoPegarCarta = new JButton("Deck");
            try {
                this.botaoPegarCarta.setIcon(new ImageIcon(ImageIO.read(Arquivos.imagemDeck)));
            } catch (IOException ex) {
                Logger.getLogger(AtorJogador.class.getName()).log(Level.SEVERE, null, ex);
            }
            this.botaoPegarCarta.setPreferredSize(new Dimension(90, 90));
            criarEventoBotaoPegarPeca();
        }

        if (!tabuleiro.getPartida().isPartidaEmRede() || (tabuleiro.getPartida().isPartidaEmRede() && tabuleiro.getPartida().getJogador1().equals(this))) {
            this.add(botaoPegarCarta, BorderLayout.EAST);
        }
    }

    public void criarPainelJogadorPontuacao() {
        painelJogadorPontuacao = new JPanel(new GridLayout(2, 2));
        painelJogadorPontuacao.add(labelNomeJogador);
        painelJogadorPontuacao.add(nomeJogador);
        painelJogadorPontuacao.add(labelPontos);
        painelJogadorPontuacao.add(pontos);
    }

    public void criarPainelBaralho() {
        painelBaralho = new JPanel(new GridLayout(1, getPecas().size(), 5, 1));
        for (final Peca peca : getPecas()) {
            if (!tabuleiro.getPartida().isPartidaEmRede() || (tabuleiro.getPartida().isPartidaEmRede() && tabuleiro.getPartida().getJogador1().equals(this))) {
                peca.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        selecionarPeca(peca);
                    }
                });
            }
            painelBaralho.add(peca, BorderLayout.CENTER);
        }

        this.add(painelBaralho, BorderLayout.CENTER);
    }

    private void criarEventoBotaoPegarPeca() {
        this.botaoPegarCarta.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!botaoPegarCarta.isSelected()) {
                    tabuleiro.pegarPeca(AtorJogador.this);
                    if (getPecaSelecionada() != null) {
                        getBotaoPegarCarta().setIcon(AtorJogador.this.getPecaSelecionada().getIcon());
                        botaoPegarCarta.setSelected(true);
                    }
                } else {
                    tabuleiro.exibirMensagem("Voce ja tem uma peca selecionada.");
                }
            }
        });
    }

    public void setPontuacao(int pontuacao) {
        this.pontuacao = pontuacao;
    }

    public void removerPeca(Peca removerPeca) {
        painelBaralho.remove(removerPeca);
    }

    public void selecionarPeca(Peca pecaSelecionada) {
        if (!tabuleiro.getPartida().getJogadorDaVez().equals(this)) {
            JOptionPane.showMessageDialog(tabuleiro, "Espere sua vez, para jogar!");
        } else {
            this.setPecaSelecionada(pecaSelecionada);
        }
    }

    void limparPecaDeck() {
        try {
            getBotaoPegarCarta().setIcon(new ImageIcon(ImageIO.read(Arquivos.imagemDeck)));
        } catch (IOException ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
        }
        getBotaoPegarCarta().setSelected(false);
    }

    void removerSeForCasteloJogador() {
        if (pecaSelecionada != null && pecaSelecionada.getTipoPeca().equals(EnumTipoPeca.CASTELO)) {
            //Remover Pecas
            pecaSelecionada.setIcon(null);
            pecaSelecionada.setEnabled(false);
//            getPainelBaralho().remove(pecaSelecionada);
        }
    }

    void removerSeForCasteloJogador(Peca pecaSelecionada) {
        if (pecaSelecionada != null && pecaSelecionada.getTipoPeca().equals(EnumTipoPeca.CASTELO)) {
            //Remover Pecas
            Peca pecaEncontrada = null;
            for (int i = 0; i < pecas.size(); i++) {
                if (pecas.get(i).getTipoPeca().equals(pecaSelecionada.getTipoPeca()) && pecas.get(i).getPontos() == pecaSelecionada.getPontos()) {
                    pecaEncontrada = pecas.get(i);
                    i = pecas.size();
                }
            }
            pecaEncontrada.setIcon(null);
            pecaEncontrada.setEnabled(false);

//            getPainelBaralho().remove(pecaEncontrada);
//            pecas.remove(pecaEncontrada);
        }
    }

    void atualizarSeuPlacar() {
        getPontos().setText(String.valueOf(pontuacao));
    }

    void sinalizarQueEhSuaVez() {
        getLabelNomeJogador().setText("-> Jogador:");
    }

    void sinalizarQueNaoEhSuaVez() {
        getLabelNomeJogador().setText("Jogador:");
    }

    public JButton getBotaoPegarCarta() {
        return botaoPegarCarta;
    }

    public void setBotaoPegarCarta(JButton botaoPegarCarta) {
        this.botaoPegarCarta = botaoPegarCarta;
    }

    public JLabel getLabelNomeJogador() {
        return labelNomeJogador;
    }

    public void setLabelNomeJogador(JLabel labelNomeJogador) {
        this.labelNomeJogador = labelNomeJogador;
    }

    public JLabel getNomeJogador() {
        return nomeJogador;
    }

    public void setNomeJogador(JLabel nomeJogador) {
        this.nomeJogador = nomeJogador;
    }

    public JLabel getPontos() {
        return pontos;
    }

    public void setPontos(JLabel pontos) {
        this.pontos = pontos;
    }

    public JLabel getLabelPontos() {
        return labelPontos;
    }

    public void setLabelPontos(JLabel labelPontos) {
        this.labelPontos = labelPontos;
    }

    public JPanel getPainelBaralho() {
        return painelBaralho;
    }

    public void setPainelBaralho(JPanel painelBaralho) {
        this.painelBaralho = painelBaralho;
    }

    public JPanel getPainelJogadorPontuacao() {
        return painelJogadorPontuacao;
    }

    public void setPainelJogadorPontuacao(JPanel painelJogadorPontuacao) {
        this.painelJogadorPontuacao = painelJogadorPontuacao;
    }

    public Tabuleiro getTabuleiro() {
        return tabuleiro;
    }

    public void setTabuleiro(Tabuleiro tabuleiro) {
        this.tabuleiro = tabuleiro;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Color getCor() {
        return cor;
    }

    public void setCor(Color cor) {
        this.cor = cor;
    }

    public List<Peca> getPecas() {
        return pecas;
    }

    public void setPecas(List<Peca> pecas) {
        this.pecas = pecas;
    }

    public Peca getPecaSelecionada() {
        return pecaSelecionada;
    }

    public void setPecaSelecionada(Peca pecaSelecionadaP) {
        if (this.pecaSelecionada == null || pecaSelecionadaP == null || this.pecaSelecionada.getTipoPeca().equals(EnumTipoPeca.CASTELO)) {
            this.pecaSelecionada = pecaSelecionadaP;
        }else{
            tabuleiro.exibirMensagem("Voçê deve utilizar a peça do deck.");
        }
    }

    public int getPontuacao() {
        return pontuacao;
    }

//    @Override
//    public boolean equals(Object obj) {
//        return getId() == ((AtorJogador)obj).getId(); //To change body of generated methods, choose Tools | Templates.
//    }
//    
}
